/**
 * 示例：如何使用 extractAudio 函数从 MP4 文件提取音频
 */
import extractAudio from '../ffmpeg/extractAudio.js';
import detection from '../ffmpeg/detection.js';
import path from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
import { getLogger, getErrorLogger, shutdownLogger } from '../utils/logger.js';

// 获取logger实例
const logger = getLogger('extractAudio');
const errorLogger = getErrorLogger();

// pnpm run example:extract

// 获取当前文件的目录路径（ES模块中没有__dirname）
// const __filename = fileURLToPath(import.meta.url);
// const __dirname = path.dirname(__filename);

// 示例输入和输出路径
// const inputPath = path.join(__dirname, "D:\\downloads\\音视频\\1.mp4");
// const outputPath = path.join(__dirname, "D:\\downloads\\音视频\\ffmpeg\\1.mp3");
const inputPath = "D:\\downloads\\音视频\\1.mp4";
const outputPath = "D:\\downloads\\音视频\\ffmpeg\\1.mp3";

/**
 * 主程序入口
 */
async function main() {
  try {
    logger.info('====== 音频提取程序开始 ======');
    logger.info('开始处理音频提取任务');
    logger.debug(`输入文件: ${inputPath}`);
    logger.debug(`输出文件: ${outputPath}`);
    
    // 检查输入文件是否存在
    if (!fs.existsSync(inputPath)) {
      const errMsg = `输入文件不存在: ${inputPath}`;
      errorLogger.error(errMsg);
      throw new Error(errMsg);
    }
    
    // 确保输出目录存在
    const outputDir = path.dirname(outputPath);
    if (!fs.existsSync(outputDir)) {
      logger.warn(`输出目录不存在，将创建目录: ${outputDir}`);
      fs.mkdirSync(outputDir, { recursive: true });
    }
    
    // 获取媒体信息
    logger.info('开始获取媒体文件信息...');
    const info = await detection(inputPath);
    
    logger.info('媒体文件信息获取成功！');
    logger.info(`文件格式: ${info.format.format_name}`);
    logger.info(`时长: ${info.duration} 秒`);
    logger.info(`文件大小: ${Math.round(info.size / 1024 / 1024 * 100) / 100} MB`);
    logger.info(`比特率: ${Math.round(info.bitRate / 1000)} Kbps`);

    console.log('----------------- 媒体文件信息获取成功！ -----------------------');
    console.log(`文件格式: ${info.format.format_name}`);
    console.log(`时长: ${info.duration} 秒`);
    console.log(`文件大小: ${Math.round(info.size / 1024 / 1024 * 100) / 100} MB`);
    console.log(`比特率: ${Math.round(info.bitRate / 1000)} Kbps`);

    // 显示视频流信息
    if (info.videoStreams.length > 0) {
      logger.info(`发现 ${info.videoStreams.length} 个视频流`);
      console.log('视频流信息:');
      info.videoStreams.forEach((stream, index) => {
        logger.debug(`视频流 #${index}: 编解码器: ${stream.codec_name}, 分辨率: ${stream.width}x${stream.height}, 帧率: ${eval(stream.r_frame_rate).toFixed(2)} fps`);
        console.log(`  流 #${index}:`);
        console.log(`    编解码器: ${stream.codec_name}`);
        console.log(`    分辨率: ${stream.width}x${stream.height}`);
        console.log(`    帧率: ${eval(stream.r_frame_rate).toFixed(2)} fps`);
      });
    } else {
      logger.warn('未发现视频流');
    }

    // 显示音频流信息
    if (info.audioStreams.length > 0) {
      logger.info(`发现 ${info.audioStreams.length} 个音频流`);
      console.log('音频流信息:');
      info.audioStreams.forEach((stream, index) => {
        logger.debug(`音频流 #${index}: 编解码器: ${stream.codec_name}, 采样率: ${stream.sample_rate} Hz, 声道数: ${stream.channels}`);
        console.log(`  流 #${index}:`);
        console.log(`    编解码器: ${stream.codec_name}`);
        console.log(`    采样率: ${stream.sample_rate} Hz`);
        console.log(`    声道数: ${stream.channels}`);
      });
    } else {
      const errMsg = '未发现音频流，无法提取音频';
      errorLogger.error(errMsg);
      throw new Error(errMsg);
    }
    console.log('----------------------------------------');

    // 提取音频
    logger.info('开始提取音频...');
    const startTime = Date.now();
    await extractAudio(inputPath, outputPath);
    const endTime = Date.now();
    const processingTime = ((endTime - startTime) / 1000).toFixed(2);
    
    logger.info(`音频提取成功！保存到: ${outputPath}`);
    logger.info(`处理耗时: ${processingTime} 秒`);
    console.log(`音频提取成功！保存到: ${outputPath}`);
    console.log(`处理耗时: ${processingTime} 秒`);
    
    logger.info('====== 音频提取程序结束 ======');
  } catch (error) {
    errorLogger.error(`程序执行出错: ${error.message}`);
    errorLogger.error(`错误堆栈: ${error.stack}`);
    console.error('程序执行出错:', error.message);
  } finally {
    // 关闭日志系统
    shutdownLogger();
  }
}

// 执行主程序
main();
